import * as tf from '@tensorflow/tfjs';
import * as tfvis from '@tensorflow/tfjs-vis';
// 线性回归 单层单个神经元
window.onload = async () => {
    const xs = [1, 2, 3];
    const ys = [2, 4, 6];
    // 散点图
    tfvis.render.scatterplot(
        { name: 'Xs vs Ys' },
        { values: xs.map((x, i) => ({ x, y: ys[i] })) },
        {
            xAxisDomain: [-1, 9],
            yAxisDomain: [2, 84]
        }
    );

    // 定义模型 连续的层 全链接层 一个输入一个输出 
    const model = tf.sequential();
    // 添加层
    model.add(tf.layers.dense({ units: 1, inputShape: [1] }));
    // 损失函数 meanSquaredError：均方误差 
    // optimizer 优化器(降低损失) sgd 随机梯度下降 0.1 学习率
    model.compile({ loss: tf.losses.meanSquaredError, optimizer: tf.train.sgd(0.1) });
    const inputs = tf.tensor(xs);
    const labels = tf.tensor(ys);
    // 训练模型 可视化
    await model.fit(inputs, labels, {
        epochs: 100, // 训练轮次
        batchSize: 10,// 批次大小
        callbacks: tfvis.show.fitCallbacks({
            name: '训练过程',
        }, ['loss'])
    }).then(() => {
        const input = 5;
        // 预测 predict
        const output = model.predict(tf.tensor([input]));
        // 转为数字
        console.log(output.dataSync()[0])
        // alert(`输入为${input}时，预测输出为${output.dataSync()[0]}`)
    });
};
